<?php
//permet de faire le mapping objet-relationnel des utilisateurs objet<-->utilisateurs bd
Class UtilisateurDAOMysql implements iDAO{
	
	
	protected $connexion;
	protected $table='utilisateur';
	
	public function __construct (){
		//on recupere la connexion
		$this->connexion=Connexion::getInstance()->getConnexion();
	}
	
	//recupere tous les utilisateurs
	public function getAll(){
	  $sql = "SELECT * FROM ".$this->table;
	  return $this->executeQuery($sql);
	}
	
	//recupere un utilisateur par son id
	public function getById($id){
	  $sql = "SELECT * FROM ".$this->table ." WHERE ID=".$id;
	  return $this->executeQuery($sql);
	}
	
	//recupere un utilisateur par son nom
	public function getByName($nom){
	  $sql = "SELECT * FROM ".$this->table ." WHERE NOM LIKE '%".$nom."%'";
	  return $this->executeQuery($sql);
	}
	
	//recupere un utilisateur par son login
	public function getByLogin($login){
		$sql = "SELECT * FROM ".$this->table." WHERE LOGIN LIKE '%".$login."%'";
		return $this->executeQuery($sql);
	}

	//ici on execute une requete de type select et on renvoie un tableau composé d'objets
	public function executeQuery($sql) {
		
		$TabObjets = array();
        $result =$this->connexion->query($sql);
		$this->throwExceptionOnError();
		
		
		 if($result) {
           while($row = $result->fetch_object()){
					//on effectue le mapping entre nos objets et les données de la base
                	$user = new Utilisateur();
                	$user->setId($row->ID);
                	$user->setNom(stripslashes($row->NOM));
					$user->setPrenom(stripslashes($row->PRENOM));
					$user->setLogin(stripslashes($row->LOGIN));
					$user->setMotDePasse(stripslashes($row->MOT_PASSE));
					$user->setTypeUtilisateur($row->TYPE_UTILISATEUR);
					$TabObjets[]=$user;
			}
		}
		
		return $TabObjets;
	}

	public function research($login)
	{
	//permet de verifier la presence du user ds la bdd avant insertion
		$Tab=array();
		$sql = "SELECT * FROM ".$this->table ." WHERE LOGIN='%".$login."%'";
		$Tab=$this->executeQuery($sql);
	
		switch (count($Tab)){
			
			case 0:
					return true;
					break;
			
			case 1:
			
				if ($client->getId()==$Tab[0]->getId()){
					return true;
					break;
				}
				else{
					return false;
					break;
				}
			
			default:
					return false;
					break;
		}
	}
	
	//fonction permettant de verifier si login et mot de passe sont bon
	public function login($login,$motDePasse)
	{
		$Tab=array();
		$sql = "SELECT * FROM ".$this->table ." WHERE LOGIN='".$login."' AND MOT_PASSE='".$motDePasse."'";
		$Tab=$this->executeQuery($sql);
		
		switch (count($Tab)){
			
			case 0:
					return 0;
					break;
			
			case 1:
					return $Tab[0]->getId();
					break;
	
			default:
					return 0;
					break;
		}
	}
	
	//permet de faire un update ou un insert selon le contexte
	public function save($client) {
		
		If ($client->getId()!=-1){
			$this->update($client);
		}
		else{
			$this->insert($client);
		}
	}
	
//methode permettant de modifier un utilisateur en bd
	public function update($client) {
		
		$sql="UPDATE ".$this->table." SET NOM=?, PRENOM=?, LOGIN=?, MOT_PASSE=?, TYPE_UTILISATEUR=? WHERE ID=?";
		//on prepare la requete
			$stmt = $this->connexion->prepare($sql);
			//on rempli avec les parametres necessaires à la requete parametree
			$stmt->bind_param('sssssi', $client->getNom(), $client->getPrenom(),$client->getLogin(),$client->getMotdePasse(),$client->getTypeUtilisateur(),$client->getId());
         	//on execute la requete
			$stmt->execute();
			$this->throwExceptionOnError();
			
	}
	
//methode permettant d inserer un utilisateur
	public function insert($client) {
		
		$sql="INSERT INTO ".$this->table." (NOM ,PRENOM,LOGIN, MOT_PASSE,TYPE_UTILISATEUR) VALUES(?,?,?,?,?)";
		//on prepare la requete
		$stmt = $this->connexion->prepare($sql);
		//on rempli avec les parametres necessaires à la requete parametree
		$stmt->bind_param('sssss', $client->getNom(), $client->getPrenom(),$client->getLogin(),$client->getMotdePasse(),$client->getTypeUtilisateur());
		//on execute la requete
		$stmt->execute();
		$this->throwExceptionOnError();
		//on renvoie l'id inseré 
	    return $this->connexion->insert_id;
	
	}
	
	//supression d'un utilsateur
	public function delete($id){

		 $sql = "DELETE  FROM ".$this->table ." WHERE ID=?";
	 	 $stmt = $this->connexion->prepare($sql);
	     $stmt->bind_param('i', $id);
	 	 $stmt->execute(); 
	 	 $this->throwExceptionOnError();
	}

	
	
	//si quelque chose c'est mal passé
	private function throwExceptionOnError(){
	
		if($this->connexion->error){
			throw new Exception('Erreur mysql'.$this->connexion->error);
		}
	}
	
	
}

?>